/*
 * serializador.cpp
 *
 *  Created on: 09/09/2011
 *      Author: guido
 */

#include "serializador.h"

int Serializador::endianOpuesto(int i) {
	int temp = (i << 24) & 0xFF000000;
	temp += (i << 8) & 0x00FF0000;
	temp += (i >> 8) & 0x0000FF00;
	temp += i >> 24  & 0x000000FF;
	return temp;
}

void Serializador::serializarInteger(char* codigo, int numero, int &indice) {
	int temp = endianOpuesto(numero);
	memcpy(codigo + indice, &temp, WORD_SIZE);
	indice += WORD_SIZE;
}

void Serializador::serializarCadena(char* codigo, std::string cadena,
		int &indice) {
	// Primero guarda el tamanyo
	int tamanyoBigEndian = endianOpuesto(cadena.size());
	memcpy(codigo + indice, &tamanyoBigEndian, WORD_SIZE);
	indice += WORD_SIZE;

	// Guardo la cadena
	if (cadena.size() > 0) {
		codigo[indice] = 0;
		strncpy(codigo + indice, cadena.c_str(), cadena.size());
		indice += cadena.size();
	}
}

int Serializador::deserializarInteger(char* codigo, int &indice) {
	int resultado = 0;
	memcpy(&resultado, codigo + indice, WORD_SIZE);
	resultado = endianOpuesto(resultado);
	indice += WORD_SIZE;
	return resultado;
}

std::string Serializador::deserializarCadena(char* codigo, int &indice) {
	// Obtengo el tamanyo de la cadena
	int tamanyo = 0;
	memcpy(&tamanyo, codigo + indice, WORD_SIZE);
	tamanyo = endianOpuesto(tamanyo);
	indice += WORD_SIZE;

	// Obtengo la cadena de acuerdo al tamanyo obtenido
	char* temp = new char[tamanyo+1];
	temp[0] = 0;
	strncpy(temp, codigo + indice, tamanyo);
	indice += tamanyo;
	temp[tamanyo] = 0;
	std::string resultado;
	resultado = temp;
	delete[] temp;
	return resultado;
}

